import { patch } from "./vdom/patch";
import Watcher from './observe/watcher'

export function mountComponent(vm) {
  let componentUpdate = () => {
    debugger;
    vm._update(vm._render())
  }
  callHook(vm, 'before')
  new Watcher(vm, componentUpdate, () => {
    console.log(111111)
    // debugger
    callHook(vm, 'created')
  }, true)
  callHook(vm, 'mounted');
}


export function lifeCycleMixin(Vue) {
  Vue.prototype._update = function (vnode) {// 更新el，
    const vm = this;
    let preVnode = vm._prevVnode;
    // 第一次渲染 是根据虚拟节点 生成真实节点，替换掉原来的节点
    vm._prevVnode = vnode
    // 如果是第二次 生成一个新得虚拟节点 ，和老的虚拟节点进行对比

    if (!preVnode) { // 没有节点就是初次渲染
      vm.$el = patch(vm.$el, vnode)
    } else {
      vm.$el = patch(preVnode, vnode)
    }
  }
}

export function callHook(vm, hook) {
  let handlers = vm.$options[hook];
  handlers && handlers.forEach(handler => {
    handler.call(vm)
  })
}